home *** CD-ROM | disk | FTP | other *** search
/ ShareWare OnLine 2 / ShareWare OnLine Volume 2 (CMS Software)(1993).iso / linux / slsv1aa3.zip / FONTPAK.TPZ / FONTPAK.tar / usr / src / fontpak / console.dif next >
Text File  |  1993-02-27  |  11KB  |  397 lines

  1. *** console.c.sav    Sat Feb 27 17:12:44 1993
  2. --- console.c    Sat Feb 27 17:25:13 1993
  3. ***************
  4. *** 1,3 ****
  5. --- 1,4 ----
  6. + #define CODEPAGE
  7.   /*
  8.    *  linux/kernel/console.c
  9.    *
  10. ***************
  11. *** 67,72 ****
  12. --- 68,90 ----
  13.   static char sel_buffer[SEL_BUFFER_SIZE] = { '\0' };
  14.   #endif /* SELECTION */
  15.   
  16. + #ifdef DEBUG
  17. + void console_print(const char * b);
  18. + #endif
  19. + #ifdef CODEPAGE
  20. + void save_font_zero( void );
  21. + int vc_activate_cp( int currcons, int whichcp );
  22. + static unsigned long    charmap_mem_base;       /* base of vga character map memory */
  23. + static unsigned short   sequencer_port_reg;
  24. + static unsigned short   sequencer_port_val;
  25. + static unsigned short   graphics_port_reg;
  26. + static unsigned short   graphics_port_val;
  27. + static int can_do_cp = 0;
  28. + static int cp;
  29. + static int cp_i;
  30. + static int cp_count;
  31. + #endif
  32.   #define NPAR 16
  33.   
  34.   extern void vt_init(void);
  35. ***************
  36. *** 114,119 ****
  37. --- 132,140 ----
  38.       /* attribute flags */
  39.       unsigned long    vc_intensity    : 2;    /* 0=half-bright, 1=normal, 2=bold */
  40.       unsigned long    vc_underline    : 1;
  41. + #ifdef CODEPAGE
  42. +     int             vc_codepage; /* offset into internal codepage info */
  43. + #endif
  44.       unsigned long    vc_blink    : 1;
  45.       unsigned long    vc_reverse    : 1;
  46.       unsigned long    vc_s_intensity    : 2;    /* saved rendition */
  47. ***************
  48. *** 133,138 ****
  49. --- 154,165 ----
  50.       /* additional information is in vt_kern.h */
  51.   } vc_cons [NR_CONSOLES];
  52.   
  53. + #ifdef CODEPAGE
  54. + #define CP_BUFFER_SIZE (256*32)
  55. + #define MAX_CPs 3
  56. + char cp_buffers[ MAX_CPs * CP_BUFFER_SIZE ];
  57. + #endif
  58.   #define MEM_BUFFER_SIZE (2*80*50*8) 
  59.   
  60.   unsigned short *vc_scrbuf[NR_CONSOLES];
  61. ***************
  62. *** 175,180 ****
  63. --- 202,211 ----
  64.   #define charset        (vc_cons[currcons].vc_charset)
  65.   #define s_charset    (vc_cons[currcons].vc_s_charset)
  66.   #define    intensity    (vc_cons[currcons].vc_intensity)
  67. + #ifdef CODEPAGE
  68. + #define codepage        (vc_cons[currcons].vc_codepage)
  69. + #endif
  70.   #define    underline    (vc_cons[currcons].vc_underline)
  71.   #define    blink        (vc_cons[currcons].vc_blink)
  72.   #define    reverse        (vc_cons[currcons].vc_reverse)
  73. ***************
  74. *** 858,868 ****
  75.       need_wrap = 0;
  76.   }
  77.   
  78.   enum { ESnormal, ESesc, ESsquare, ESgetpars, ESgotpars, ESfunckey, 
  79. !     EShash, ESsetG0, ESsetG1, ESignore };
  80.   
  81.   static void reset_terminal(int currcons, int do_clear)
  82.   {
  83.       top        = 0;
  84.       bottom        = video_num_lines;
  85.       state        = ESnormal;
  86. --- 889,908 ----
  87.       need_wrap = 0;
  88.   }
  89.   
  90. + #ifndef CODEPAGE
  91. + enum { ESnormal, ESesc, ESsquare, ESgetpars, ESgotpars, ESfunckey, 
  92. +     EShash, ESsetG0, ESsetG1, ESignore};
  93. + #else
  94.   enum { ESnormal, ESesc, ESsquare, ESgetpars, ESgotpars, ESfunckey, 
  95. !     EShash, ESsetG0, ESsetG1, ESignore, EScodepage0, EScodepage1,
  96. !     EScpPROG, EScpPROG1, EScpPROG2, EScpUSE };
  97. ! #endif
  98.   
  99.   static void reset_terminal(int currcons, int do_clear)
  100.   {
  101. + #ifdef CODEPAGE
  102. +     codepage = 0;
  103. + #endif
  104.       top        = 0;
  105.       bottom        = video_num_lines;
  106.       state        = ESnormal;
  107. ***************
  108. *** 930,936 ****
  109. --- 970,981 ----
  110.               }
  111.               if (decim)
  112.                   insert_char(currcons);
  113. + #ifdef CODEPAGE
  114. +             if( !codepage )
  115. +                 c=translate[ c ];
  116. + #else
  117.               c = translate[c];
  118. + #endif
  119.               *(char *) pos = c;
  120.               *(char *) (pos+1) = attr;
  121.               if (x == video_num_columns - 1)
  122. ***************
  123. *** 994,999 ****
  124. --- 1039,1049 ----
  125.               case ESesc:
  126.                   state = ESnormal;
  127.                   switch (c) {
  128. + #ifdef CODEPAGE
  129. +                                   case 'F':             /* We have ESC-F.  Codepage stuff! */
  130. +                                         state = EScodepage0;
  131. +                                         continue;
  132. + #endif
  133.                     case '[':
  134.                       state = ESsquare;
  135.                       continue;
  136. ***************
  137. *** 1209,1214 ****
  138. --- 1259,1265 ----
  139.                       G1_charset = GRAF_TRANS;
  140.                   else if (c == 'B')
  141.                       G1_charset = NORM_TRANS;
  142.                   else if (c == 'U')
  143.                       G1_charset = NULL_TRANS;
  144.                   if (charset == 1)
  145. ***************
  146. *** 1215,1220 ****
  147. --- 1266,1354 ----
  148.                       translate = G1_charset;
  149.                   state = ESnormal;
  150.                   continue;
  151. + #ifdef CODEPAGE
  152. +             case EScodepage0:        /* we have ESC-ESC-ESC */
  153. +             switch( c )
  154. +                 {
  155. +                 case 'P':    
  156. +                 state = EScpPROG;
  157. +                 continue;
  158. +                 case 'U':
  159. +                 state = EScpUSE;
  160. +                 continue;
  161. +                 default:
  162. +                 state = ESnormal;
  163. +                 }
  164. +             continue;
  165. +             case EScpPROG:
  166. +             /* We Now have ESC-F-P.  The next byte is the codepage that
  167. +                 needs to be programmed */
  168. +             cp = c - '0'; /* let us use ascii number */
  169. +             if( cp > 0 && cp < MAX_CPs )
  170. +                 {
  171. +                 /*********************************************
  172. +                 We now have ESC-F-P-<NUMBER>, where number is
  173. +                 the ascii for a valid codepage number. The next
  174. +                 8192*2 characters are assumed to  be codepage
  175. +                 data bytes, expressed in hexadecimal.
  176. +                 **********************************************/
  177. +                 state = EScpPROG1;
  178. +                 /* point to eh beginning of the current buf */
  179. +                 cp_i = cp * CP_BUFFER_SIZE;
  180. +                 cp_count = 0;
  181. +                 }
  182. +             else state = ESnormal;
  183. +             continue;
  184. +             case EScpPROG1:
  185. +             /*****************************************************
  186. +             We are receiving data bytes.  To keep things ASCII,
  187. +             there are two characters for each byte of binary data.
  188. +             This is the case for the  bytes ( first, third, fifth,
  189. +             etc ), and ESCcpPROG2 is the  for the even bytes
  190. +             ( second, fourth, etc ).  Of course, the 
  191. +             writes to the font buffer take place on the EVEN bytes.
  192. +             *****************************************************/
  193. +             c -= '0';/* ascii hexadecimal to binary conversion */
  194. +             if( c>9 ) c-=7;
  195. +             cp_buffers[ cp_i ] = c;
  196. +             state = EScpPROG2;
  197. +             continue;
  198. +             case EScpPROG2:
  199. +             /******************************************************
  200. +             This state is for the even-# codepage data bytes.....
  201. +             ******************************************************/
  202. +             c -= '0';
  203. +             if( c>9 ) c-=7;
  204. +             cp_buffers[ cp_i ] *= 0x10;  /* move the odd data up */
  205. +             /* move the new ( even ) data into the lower nybble */
  206. +             cp_buffers[ cp_i++ ] += c;
  207. +             if( ++cp_count == CP_BUFFER_SIZE )
  208. +               {
  209. +               state = ESnormal;
  210. +               }
  211. +             else state = EScpPROG1;
  212. +             continue;
  213. +             case EScpUSE:
  214. +             /*****************************************************
  215. +             We now have ESC-F-U. We still need to know which
  216. +             codepage we are to use. Choice is zero to MAX_CPs - 1
  217. +             ******************************************************/
  218. +             cp = c - '0';
  219. +             if( cp < MAX_CPs )
  220. +                 {
  221. +                 vc_activate_cp( currcons, cp );
  222. +                 }
  223. +             state = ESnormal;
  224. +             continue;
  225. + #endif  /* CODEPAGE? */
  226.               default:
  227.                   state = ESnormal;
  228.           }
  229. ***************
  230. *** 1310,1315 ****
  231. --- 1444,1459 ----
  232.               video_type = VIDEO_TYPE_EGAC;
  233.               video_mem_term = 0xc0000;
  234.               display_desc = "EGA+";
  235. + #ifdef CODEPAGE
  236. +                 can_do_cp = 1;
  237. +             charmap_mem_base = 0xa0000;
  238. +             sequencer_port_reg = 0x3c4;
  239. +             sequencer_port_val = 0x3c5;
  240. +             graphics_port_reg = 0x3ce;
  241. +             graphics_port_val = 0x3cf;
  242. +             save_font_zero();
  243. + #endif
  244.           }
  245.           else
  246.           {
  247. ***************
  248. *** 1351,1356 ****
  249. --- 1495,1503 ----
  250.       gotoxy(currcons,orig_x,orig_y);
  251.       update_screen(fg_console);
  252.       printable = 1;
  253. + #ifdef CODEPAGE
  254. +     if( can_do_cp ) codepage=0;
  255. + #endif
  256.       printk("Console: %s %s %dx%d, %d virtual consoles\n",
  257.           can_do_color?"colour":"mono",
  258.           display_desc,
  259. ***************
  260. *** 1424,1429 ****
  261. --- 1571,1579 ----
  262.       fg_console = new_console;
  263.       set_scrmem(fg_console); 
  264.       set_origin(fg_console);
  265. + #ifdef CODEPAGE
  266. +     vc_activate_cp( new_console, vc_cons[new_console].vc_codepage );
  267. + #endif
  268.       set_cursor(new_console);
  269.       set_leds();
  270.       lock = 0;
  271. ***************
  272. *** 1519,1524 ****
  273. --- 1669,1778 ----
  274.           return -ENODEV;
  275.       return 0;
  276.   }
  277. + #ifdef CODEPAGE
  278. +  /*
  279. +   * Program EGA sequencer and graphics controller to access downloadable
  280. +   * font region.  From _Video Systems_, p. 307.
  281. +   */
  282. +  
  283. + void setsf( void )
  284. +     {
  285. +     cli();
  286. +     outb_p( 0x00, sequencer_port_reg );   /* First, the sequencer */
  287. +     outb_p( 0x01, sequencer_port_val );   /* Synchronous reset */
  288. +     outb_p( 0x02, sequencer_port_reg );   
  289. +     outb_p( 0x04, sequencer_port_val );   /* CPU writes only to map 2 */
  290. +     outb_p( 0x04, sequencer_port_reg );
  291. +     outb_p( 0x07, sequencer_port_val );   /* Sequential addressing */
  292. +     outb_p( 0x00, sequencer_port_reg );
  293. +     outb_p( 0x03, sequencer_port_val );   /* Clear synchronous reset */
  294. +               
  295. +     outb_p( 0x04, graphics_port_reg );    /* Now, the graphics controller */
  296. +     outb_p( 0x02, graphics_port_val );    /* select map 2 */
  297. +     outb_p( 0x05, graphics_port_reg );    
  298. +     outb_p( 0x00, graphics_port_val );    /* disable odd-even addressing */
  299. +     outb_p( 0x06, graphics_port_reg );    
  300. +     outb_p( 0x00, graphics_port_val );    /* map start at A000:0000 */
  301. +     sti();
  302. +     }
  303. +     
  304. +     
  305. +     /*
  306. +     * Program EGA back the way it was, for ordinary text operations.
  307. +     * (If the screen was in graphics mode we're up a creek.)
  308. +     * From _Video Systems_, p. 307.
  309. +     */
  310. +     
  311. + void unsetsf( void )
  312. +     {
  313. +     cli();
  314. +     outb_p( 0x00, sequencer_port_reg );   /* Frist, the sequencer */
  315. +     outb_p( 0x01, sequencer_port_val );   /* Synchronous reset */
  316. +     outb_p( 0x02, sequencer_port_reg );   
  317. +     outb_p( 0x03, sequencer_port_val );   /* CPU writes to maps 0 and 1 */
  318. +     outb_p( 0x04, sequencer_port_reg );   
  319. +     outb_p( 0x03, sequencer_port_val );   /* odd-even addressing */
  320. +     outb_p( 0x00, sequencer_port_reg );   
  321. +     outb_p( 0x03, sequencer_port_val );   /* clear synchronous reset */
  322. +     
  323. +     outb_p( 0x04, graphics_port_reg );    /* Now, the graphics controller */
  324. +     outb_p( 0x00, graphics_port_val );    /* select map 0 for CPU */
  325. +     outb_p( 0x05, graphics_port_reg );    
  326. +     outb_p( 0x10, graphics_port_val );    /* enable even-odd addressing */
  327. +     outb_p( 0x06, graphics_port_reg );    
  328. +     outb_p( 0x0e, graphics_port_val );    /* map starts at b800:0000 */
  329. +     sti();
  330. +     }
  331. +     
  332. +     
  333. + /*************************************
  334. + int vc_progcp( int whichcp, char *data ) 
  335. +     {
  336. +     unsigned long tmp = cp_buffers;
  337. +     tmp += (whichcp*256*32);
  338. +     if(( whichcp < MAX_CPs) && (whichcp > 0))
  339. +         {
  340. +         memcpy((void *) tmp,(void *)data,256*32);
  341. +         return(0);
  342. +         }
  343. +     else return (-EINVAL);
  344. +     }
  345. + ******************************************/
  346. +     
  347. + void load_cp( int whichcp )
  348. +     {
  349. +     void *tmp_p = cp_buffers;
  350. +     tmp_p += ( whichcp * 256 * 32 );
  351. +     setsf();                          /* enable EGA access */
  352. +     memcpy( (void *) charmap_mem_base, tmp_p, 256*32 ); /* do it */
  353. +     unsetsf();     /*disable EGA access*/
  354. +     }
  355. +     
  356. + int vc_activate_cp( int currcons, int whichcp )
  357. +     {
  358. +     if(( whichcp < MAX_CPs ) && ( currcons < NR_CONSOLES ))
  359. +         {
  360. +         codepage = whichcp;
  361. +         if( currcons == fg_console ) load_cp( whichcp );
  362. +         return (0);
  363. +         }
  364. +     else return (-EINVAL);
  365. +     }
  366. +     
  367. +     
  368. + void save_font_zero( void )
  369. +     {
  370. +     if( can_do_cp )
  371. +         {
  372. +         setsf();
  373. +         memcpy((void *)cp_buffers, (void *) charmap_mem_base, ( 256*32 ));
  374. +         unsetsf();
  375. +         }
  376. +     }
  377. + #endif /* CODEPAGE? */
  378.   
  379.   #ifdef SELECTION
  380.   /* set reverse video on characters s-e of console with selection. */
  381.